<?

/**
 * Citas class
 *
 * Esta clase maneja las citas de los clientes
 * @author Alejandro Garcia del Rio <alejandro.garciadelrio@elserver.com>
 * @version 1.0
 * @package Citas
*/
class Citas extends Core {

	static protected $instancia;
	static protected $opciones = array(
		'rpp' => 100, // Resultados por pagina 
		'filtros' => '', // Filtros para la funcion listar
		'page' => 1, // Numero de pagina por defecto
		'order' => 'c.fecha_inicio', // Ordenamiento de listar()
		'order_type' => 'ASC' // Tipo de ordenamiento (ASC/DESC)
	);
	private $count = 0;
	private $paginas = 0;
	private $id_usuario = null;

	/**
	 * Constructor de la clase.
	 * 
	 * @param array $opciones (opcional) Opciones validas para esta clase
	 */
	function __construct ($opciones=null) {
		// Llamo al constructor del parent tambien
		parent::__construct();
		// Guardo las opciones si me definio alguna
		if ($opciones)
			$this->opciones($opciones);
	}

	/**
	 * Setea las opciones 
	 * 
	 * @param array $opciones (opcional) Opciones validas para esta clase. Si esta vacio, funciona como un getter.
	 * @return array $opciones Listado de opciones
	 */
	public function opciones ($opciones=null) {
		return self::$opciones = parent::opciones(self::$opciones, $opciones);
	}

	/**
	 * Devuelve una unica instancia de esta clase
	 * 
	 * @return object Instancia de esta clase
	 */
	public static function getInstance() {
		if (!self::$instancia instanceof self)
			self::$instancia = new self;
		return self::$instancia;
	}

	/**
	 * Agrega una nueva cita para un cliente
	 * 
	 * @param array $cita Informacion de la cita a agregar
	 * @return integer
	 */
	public function agregar ($cita) {

		// Obtengo un objeto de sesion
		$Session = ($this)? $this->Session : Session::getInstance();

		// Obtengo el usuario logueado
		$id_usuario = $Session->get('usuario.id');

		// No hay cita definida
		if (!is_array($cita) || empty($cita))
			return ($this)? $this->fail('No hay una cita especificada') : false;

		// Valido que tenga un id de usuario
		if (!$cita['id_cliente'])
			return ($this)? $this->fail('No hay un id de cliente especificado') : false;

		// Obtengo un objeto de conexion a la base
		$db = ($this)? $this->db : ez_sql::getInstance();

		// Si no tiene fecha_fin, le pongo una duracion de una hora desde la fecha de inicio
		if (!$cita['fecha_fin'])
			$cita['fecha_fin'] = date("Y-m-d H:i:s", (strtotime($cita['fecha_inicio'])+(60*60)));

		// Seteo algunos parametros
		unset($cita['id_cita']);
		unset($cita['ctime']);
		unset($cita['pendiente']);
		$cita['id_usuario'] = $id_usuario;
		$cita['fecha_inicio'] = date("Y-m-d H:i:s", strtotime($cita['fecha_inicio']));
		$cita['fecha_fin'] = date("Y-m-d H:i:s", strtotime($cita['fecha_fin']));

		// Inserto la cita
		$id_cita = $db->insert("citas", $cita);

		return $id_cita;
	}


	/**
	 * Lista las citas
	 * 
	 * @param $opciones (Opcional) Opciones de esta clase 
	 * @return object Instancia de esta clase
	 */
	public function listar ($opciones=null) {

		// Obtengo el objeto de base de datos
		$db = ($this)? $this->db : ez_sql::getInstance();

		// Obtengo un objeto de sesion
		$Session = ($this)? $this->Session : Session::getInstance();

		// Obtengo el usuario logueado
		if ( !($id_usuario = $Session->get('usuario.id')) )
			return ($this)? $this->fail('No estas logueado') : false;

		// Seteo las opciones
		$opciones = ($this instanceof self)? $this->opciones($opciones) : self::opciones($opciones);
		
		// Armo los filtros
		$and = '';
		if ($opciones['filtros'])
			$and = 'AND '.implode(' AND ', $opciones['filtros']);

		// Query base
		$query = "SELECT SQL_CALC_FOUND_ROWS c.*, CONCAT(cl.nombre, ' ', cl.apellido) cliente, u.nombre usuario
					FROM citas c
					LEFT JOIN clientes cl ON c.id_cliente = cl.id_cliente
					LEFT JOIN usuarios u ON c.id_usuario = u.id_usuario
					WHERE 1=1 $and
					ORDER BY ".$opciones['order']." ".$opciones['order_type']." 
					LIMIT ".(($opciones['page']-1)*$opciones['rpp']).", ".$opciones['rpp'];
		
		// Ejecuto el query
		$citas = $db->get_results($query);
		
		//$db->debug();
		
		// Calculo la cantidad de resultados
		$count = $db->get_var('SELECT FOUND_ROWS()');
		if ($this instanceof self)
			$this->count = $count;

		$paginas = ($this instanceof self)? $this->paginas() : self::paginas($count, $opciones['rpp']);

		return array('paginas' => $paginas, 'resultados' => $count, 'data' => $citas);
	}

	/**
	 * Devuelve cuantos resultados hay en la consulta
	 * 
	 * Los resultados son cargados previamente por la funcion listar
	 * @return integer Cantidad de resultados
	 */
	public function count () {
		return $this->count;
	}

	/**
	 * Devuelve la cantidad de paginas que devolvio la consulta
	 * 
	 * Los resultados son cargados previamente por la funcion listar
	 * @param array $count (Opcional) Cantidad total se resultados
	 * @param array $rpp (Opcional) Cantidad de resultados por pagina
	 * @return integer Cantidad de resultados
	 */
	public function paginas ($count=null, $rpp=null) {

		$rpp = (!$rpp)? self::$opciones['rpp'] : $rpp;
		$count = (!$count && $this instanceof self)? $this->count() : $count;

		// No se puede dividir por 0
		if ($rpp == 0)
			return 0;

		return ceil($count/$rpp);
	}

	/**
	 * Devuelve el contenido de una cita
	 * 
	 * @param $id_cita integer El id de cita
	 * @return array
	 */
	public function get ($id_cita) {

		// Saneamiento de variables
		$id_cita = addslashes($id_cita);

		// Obtengo un objeto de base de datos
		$db = ($this)? $this->db : ez_sql::getInstance();

		// Obtengo la informacion de la cita
		if (!$cita = $db->get_row("SELECT c.*, IFNULL(u.nombre, '-') usuario FROM citas c LEFT JOIN usuarios u ON c.id_usuario = u.id_usuario WHERE c.id_cita = $id_cita"))
			return false;
		
		// Obtengo la informacion del cliente
		$cliente = Cliente::get($cita['id_cliente']);

		// Seteo el nombre del cliente
		$cita['cliente'] = $cliente['nombre'].' '.$cliente['apellido'];
		
		return $cita;
	}

	/**
	 * Cancela una cita
	 * 
	 * @param $id_cita integer El id de cita a cancelar
	 * @return object Instancia de esta clase
	 */
	public function cancelar ($id_cita) {

		// Saneamiento de variables
		$id_cita = addslashes($id_cita);

		// Obtengo un objeto de base de datos
		$db = ($this)? $this->db : ez_sql::getInstance();

		// Obtengo un objeto de sesion
		$Session = ($this)? $this->Session : Session::getInstance();

		// Obtengo la cita a eliminar
		$cita = ($this)? $this->get($id_cita) : self::get($id_cita);
		if (!$cita)
			return ($this)? $this->fail('No se encontro la cita') : false;

		// Obtengo el usuario logueado
		if ( !($id_usuario = $Session->get('usuario.id')) )
			return ($this)? $this->fail('No estas logueado') : false;

		// Valido que el usuario de la cita sea el logueado
		if ($id_usuario != $cita['id_usuario'])
			return ($this)? $this->fail('No podes cancelar una cita que no te corresponda') : false;

		// Valido que no este marcada como realizada
		if ($cita['pendiente'] != 1)
			return ($this)? $this->fail('No se puede cancelar una cita realizada') : false;

		// Elimino la cita
		$db->update('citas', array('id_cita' => $id_cita, 'pendiente' => 2));

		return true;
	}

	/**
	 * Modifica una cita del usuario actual
	 * 
	 * @param $cita array Datos a modificar en esta cita
	 * @param $id_cita integer El id de cita a modificar
	 * @return object Instancia de esta clase
	 */
	public function modificar ($cita, $id_cita) {

		// Saneamiento de variables
		$id_cita = addslashes($id_cita);

		// Obtengo un objeto de base de datos
		$db = ($this)? $this->db : ez_sql::getInstance();

		// Obtengo un objeto de sesion
		$Session = ($this)? $this->Session : Session::getInstance();

		// Obtengo la cita a modificar
		$old_cita = self::get($id_cita);
		if (!$old_cita)
			return ($this)? $this->fail('No se encontro la cita') : false;

		// Obtengo el usuario logueado
		if ( !($id_usuario = $Session->get('usuario.id')) )
			return ($this)? $this->fail('No estas logueado') : false;

		// Valido que el usuario de la cita sea el logueado
		if ($id_usuario != $old_cita['id_usuario'])
			return ($this)? $this->fail('No podes eliminar una cita que no te corresponda') : false;

		// Valido que no este marcada como realizada
		if ($old_cita['pendiente'] != 1)
			return ($this)? $this->fail('No se puede modificar una cita realizada') : false;

		// Campos habilitados para modificacion
		$campos = array('id_caso', 'fecha_inicio', 'fecha_fin', 'titulo', 'descripcion', 'pendiente');

		// Solo dejo los campos habilitados para modificacion
		if (is_array($cita) && !empty($cita))
			foreach ($cita as $t)
				if (!isset($campos[$t]))
					unset($cita[$t]);
		$cita['id_cita'] = $id_cita;

		// Ejecuto la modificacion
		$db->update('citas', $cita);

		return true;
	}

	/**
	 * Marca una cita como realizada
	 * 
	 * @return object Instancia de esta clase
	 */
	public function hecho ($id_cita) {

		// Saneamiento de variables
		$id_cita = addslashes($id_cita);

		// Obtengo un objeto de base de datos
		$db = ($this)? $this->db : ez_sql::getInstance();

		// Modifico la cita
		$db->update('citas', array('id_cita' => $id_cita, 'pendiente' => 0));

		return true;
	}
		
	/**
	 * Devuelve un JSON de citas con el formato requerido por FullCalendar
	 * 
	 * @return boolean
	 */
	public function fullcalendar () {

		// Obtengo un objeto de sesion
		$Session = ($this)? $this->Session : Session::getInstance();
	
		// Obtengo el usuario logueado
		if ( !($id_usuario = $Session->get('usuario.id')) )
			return ($this)? $this->fail('No estas logueado') : false;
		
		// Seteo las opciones
		//$opciones = array('filtros' => array('c.pendiente = 1'));
		$opciones = array('filtros' => array("c.fecha_inicio >= '".date("Y-m-d", $_GET['start'])."'", "c.fecha_inicio <= '".date("Y-m-d", $_GET['end'])."'"));
		
		// Pido el listado
		$citas = ($this instanceof self)? $this->listar($opciones) : self::listar($opciones);

		foreach ($citas['data'] as $k => $cita) {
			// Datos basicos
			$result[$k]['title'] = iconv('iso-8859-1', 'utf-8', str_replace('Cita con el cliente', '', $cita['titulo']))." [".$cita['usuario']."]";
			$result[$k]['start'] = strtotime($cita['fecha_inicio']);
			$result[$k]['end'] = strtotime($cita['fecha_fin']);
			$result[$k]['allDay'] = false;
			// Defino el link segun si es pendiente o realizada
			$result[$k]['url'] = '/ss/citas/' . (($cita['pendiente']) ? 'pendientes' : 'archivo') . '/ver/' . $cita['id_cita'];
			// Defino el color
			$array_colores = array('#62DB2A', '#2A63DC', '#AAAAAA');
			$result[$k]['color'] = $array_colores[$cita['pendiente']]; // tarea personal
		}

		return $result;
	}

	/**
	 * Elimina una cita
	 * 
	 * @param $id_cita integer El id de cita a eliminar
	 * @return boolean
	 */
	public function eliminar ($id_cita) {

		// Saneamiento de variables
		$id_cita = addslashes($id_cita);

		// Obtengo un objeto de base de datos
		$db = ($this)? $this->db : ez_sql::getInstance();

		// Modifico la cita
		$db->query("DELETE FROM citas WHERE id_cita = $id_cita LIMIT 1");

		return true;
	}
		
	/**
	 * Marca una cita como pendiente
	 * 
	 * @param $id_cita integer El id de cita a marcar como pendiente
	 * @return boolean
	 */
	public function pendiente ($id_cita) {

		// Saneamiento de variables
		$id_cita = addslashes($id_cita);

		// Obtengo un objeto de base de datos
		$db = ($this)? $this->db : ez_sql::getInstance();

		// Modifico la cita
		$db->update('citas', array('id_cita' => $id_cita, 'pendiente' => 1));

		return true;
	}
		
}

?>
